#对不处于最后付息周期的固定利率债券
'''计算债券到期收益率的函数
    PV:表示债券全价；
    c:票面年利率；
    f:年付息频率；
    y:到期收益率；
    d:债券结算日至下一最近付息日之间的实际天数；
    N:结算日至到期兑付日的债券付息次数；
    TS:当前付息周期的实际天数。
    FV:债券面值;'''
import scipy.optimize as so
import numpy as np
def YTM_fixbond_nolastcoupon(PV,c,f,d,N,TS,FV):
    def g(y):
        coupon=[]
        for i in np.arange(1,N+1):
            coupon.append((c*FV/f)/pow(1+y/f,d/TS+i-1))
        return np.sum(coupon)+FV/pow(1+y/f,d/TS+N-1)-PV  #相当于输出一个等于0的式子
    return so.fsolve(g,0.1)     #0.1为猜测的求解值

Bond_yield3=YTM_fixbond_nolastcoupon(PV=101.2364,c=0.0302,f=1,d=276,N=4,TS=365,FV=100)
print('计算得到债券的到期收益率',np.round(Bond_yield3,6))
